home *** CD-ROM | disk | FTP | other *** search
/ 3D Game Programming All in One / 3D Game Programming All in One Disc.iso / 3D2E / RESOURCES / KOOB / control / server / players / ai.cs next >
Encoding:
Text File  |  2004-03-16  |  10.6 KB  |  393 lines

  1.  
  2. //-----------------------------------------------------------------------------
  3. // Callback Handlers
  4. //-----------------------------------------------------------------------------
  5.  
  6. //$MINIMUM_SCAN_INTERVAL = 2000;
  7. //$MAXIMUM_SCAN_INTERVAL = 10000;
  8.  
  9. $MIN_SCAN_GAP = 1000;
  10. $MAX_SCAN_GAP = 20000;
  11. $MIN_TRIGGER_HOLD = 100;
  12. $MAX_TRIGGER_HOLD = 200;
  13. $MIN_ITCHY_FINGER = 2000;
  14. $MAX_ITCHY_FINGER = 10000;
  15. $MAX_THREAT_ENGAGE_RANGE = 100;
  16. $MAX_AGGRESSIVENESS = 100;
  17. $MAX_ATTENTION_LEVEL = 100;
  18. $MAX_ALERTNESS = 100;
  19. $MAX_ROVER_SPEED = 0.2;
  20. $MIN_ROVER_SPEED = 0.1;
  21. $MAX_PATROL_SPEED = 0.2;
  22. $MIN_PATROL_SPEED = 0.1;
  23. $STATIONARY = 0.0;
  24.  
  25. $cardinalDirection[0] = "0 10000 0";
  26. $cardinalDirection[1] = "10000 0 0";
  27. $cardinalDirection[2] = "0 -10000 0";
  28. $cardinalDirection[3] = "-10000 0 0";
  29.  
  30. function AIBeast::onStuck(%this,%obj)
  31. {
  32.    // Invoked if the player is stuck while moving
  33.    // This method is currently not being invoked correctly.
  34.    if(!isObject(%obj))
  35.       return;
  36.    echo( "I'm stuck !! (from:"@%obj@")");
  37. }
  38.  
  39. function AIBeast::unBlock(%this,%obj)
  40. {
  41.    //echo( "unBlock... (from:"@%obj@")");
  42.    if(!isObject(%obj))
  43.       return;
  44.    cancel(%obj.nextBlockCheck);
  45.    %this.onReachDestination(%obj);
  46.  
  47. }
  48.  
  49. function AIBeast::onReachDestination(%this,%obj)
  50. {
  51.    // Invoked when the player arrives at his destination point.
  52. //   echo( "onReachDestination" );
  53.    if(!isObject(%obj))
  54.       return;
  55.     cancel(%obj.nextBlockCheck);
  56.    %theRole = %obj.role;
  57.  
  58.   // echo( "finding new dest !!! (from:"@%obj@")");
  59.     %obj.setMoveSpeed($MIN_ROVER_SPEED);
  60.     %victim = %obj.getAimObject();
  61.     %this.setRandomDestination(%obj);
  62.     %obj.nextBlockCheck = %this.schedule($MAX_SCAN_GAP*2, "unBlock", %obj);
  63. //     echo( "----%this.scheduledCheck" @ %this.scheduledCheck);
  64.  
  65. }
  66.  
  67. function AIBeast::checkForThreat(%this,%obj)
  68. {
  69. //   echo( "checkForThreat...");
  70.    if(!isObject(%obj))
  71.       return;
  72.  
  73.    if (isObject( %obj) )
  74.    {
  75.       %idx = %obj.getClosestHuman();
  76.       if (%obj.attentionLevel>0)  // if attentionLevel is non-zero, keep looking at max range
  77.       {
  78.          %testRange = %obj.range * (%obj.aggression*2);
  79.       }
  80.       else
  81.       {
  82.          %testRange = %obj.range;
  83.       }
  84.    }
  85.    else
  86.    {
  87.       return 0;
  88.    }
  89.    if (%idx < 0)
  90.       return 0;
  91.    %target = ClientGroup.getObject( %idx );
  92.  
  93.    if (%target.player == %obj.currentTarget)
  94.    {
  95.       if (isObject( %obj) )
  96.       {
  97.          if ( %obj.GetTargetRange(%target.player) <  %testRange)
  98.          {
  99.             return %target.player;
  100.          }
  101.       }
  102.       else
  103.          return 0;
  104.    }
  105.    else     /// new threat
  106.    {
  107.       if (isObject( %obj) )
  108.       {
  109.          if ( %obj.GetTargetRange(%target.player) <  %testRange)
  110.          {
  111.             return %target.player;
  112.          }
  113.       }
  114.       else
  115.          return 0;
  116.    }
  117.  //  echo( "...no threat");
  118.    return 0;
  119. }
  120.  
  121. function AIBeast::DoScan(%this,%obj)
  122. {
  123.    //echo( "doScan... (from:"@%obj@")");
  124.    if(!isObject(%obj))
  125.       return;
  126.    cancel(%this.scheduledCheck);
  127.  
  128.    %theRole = %obj.role;
  129.  
  130.    if (%obj.attentionLevel<=0)  // if attentionLevel is non-zero, keep looking in same direction
  131.       %obj.attentionLevel=0;
  132.    else
  133.       %obj.attentionLevel--;
  134.  
  135.   if (%obj.attentionLevel==0)  // if attentionLevel is non-zero, keep looking in same direction
  136.   {
  137.      %look = getRandom(3);
  138.      if (%this.look != %look)
  139.         %this.look = %look;
  140.      else
  141.      {
  142.         %this.look = %look + 1;
  143.         if (%this.look < 3)
  144.            %this.look++;
  145.         else
  146.            %this.look = 0;
  147.      }
  148.   }
  149.  
  150.   %t = $cardinalDirection[%this.look];
  151.   %obj.setAimLocation( %t);
  152.  
  153.    if ( (%tgtPlayer = %this.checkForThreat(%obj)) != 0)
  154.    {
  155.       if (%obj.currentTarget)
  156.       {
  157.          if (%obj.currentTarget==%tgtPlayer)
  158.          {
  159.            // echo( "STILL A THREAT (from:"@%obj@")");
  160.             %obj.setAimObject( %tgtPlayer );
  161.             %obj.attentionLevel = %obj.attention;
  162.             if (%theRole !$= "Guard")
  163.             {
  164.                %obj.setMoveSpeed($MAX_ROVER_SPEED);
  165.                %obj.setMoveDestination(%tgtPlayer.getPosition());
  166.                %obj.nextBlockCheck = %this.schedule($MAX_SCAN_GAP*2, "unBlock", %obj);
  167.             }
  168.          }
  169.          else
  170.          {
  171.            // echo( "CHANGED THREAT (from:"@%obj@")");
  172.             %obj.currentTarget =  %tgtPlayer;
  173.             %obj.setAimObject( %obj.currentTarget );
  174.             if (%theRole !$= "Guard")
  175.             {
  176.                %obj.setMoveSpeed($MAX_ROVER_SPEED);
  177.                %obj.setMoveDestination(%tgtPlayer.getPosition());
  178.                %obj.nextBlockCheck = %this.schedule($MAX_SCAN_GAP*2, "unBlock", %obj);
  179.             }
  180.          }
  181.        }
  182.        else
  183.        {
  184.          //echo( "NEW THREAT!! (from:"@%obj@")");
  185.          %obj.setAimObject( %tgtPlayer );
  186.          %obj.currentTarget =  %tgtPlayer;
  187.          %obj.attentionLevel = %obj.attention;
  188.          if (%theRole !$= "Guard")
  189.          {
  190.             %obj.setMoveSpeed($MAX_ROVER_SPEED);
  191.             %obj.setMoveDestination(%tgtPlayer.getPosition());
  192.             %obj.nextBlockCheck = %this.schedule($MAX_SCAN_GAP*2, "unBlock", %obj);
  193.          }
  194.        }
  195.    }
  196.    else
  197.    {
  198.       if (%obj.getAimObject)
  199.       {
  200.          %obj.clearAim();
  201.         // echo( "doScan >>> %obj.clearAim (from:"@%obj@")");
  202.          %obj.currentTarget = 0; // forget this target
  203.       }
  204.       %this.nextScan = %this.schedule($MIN_SCAN_GAP+getRandom($MAX_SCAN_GAP/%this.alertness), "doScan", %obj);
  205.    }
  206. }
  207.  
  208. function AIBeast::openFire(%this,%obj)
  209. {
  210.    if(!isObject(%obj))
  211.       return;
  212.    %obj.setImageTrigger(0,false);
  213.    %this.schedule($MIN_TRIGGER_HOLD+getRandom($MAX_TRIGGER_HOLD), "ceaseFire", %obj);
  214. }
  215.  
  216. function AIBeast::ceaseFire(%this,%obj)
  217. {
  218.    //echo( "--------ceaseFire... (from:"@%obj@")");
  219.    if(!isObject(%obj))
  220.       return;
  221.    %obj.setImageTrigger(0,false);
  222.    %obj.clearAim();
  223.    %obj.currentTarget = 0; // forget this target
  224. }
  225.  
  226. function AIBeast::onTargetEnterLOS(%this,%obj)
  227. {
  228.    // If an aim target object is set, this method is invoked when
  229.    // that object becomes visible.
  230.   //  echo( "LOS TARGET ! (from:"@%obj@")");
  231.    if(!isObject(%obj))
  232.       return;
  233.    %theRole = %obj.role;
  234.  
  235.    %obj.attentionLevel = %this.attention;
  236.    %this.schedule($MIN_ITCHY_FINGER+getRandom($MAX_ITCHY_FINGER), "openFire", %obj);
  237.    %this.schedule($MIN_SCAN_GAP+getRandom($MAX_SCAN_GAP/%this.alertness), "doScan", %obj);
  238.    %obj.setImageTrigger(0,true);
  239. }
  240.  
  241. function AIBeast::onTargetExitLOS(%this,%obj)
  242. {
  243.    // If an aim target object is set, this method is invoked when
  244.    // the object is not longer visible.
  245.   // echo( ".......Fuhgetaboutit (from:"@%obj@")");
  246.    if(!isObject(%obj))
  247.       return;
  248.    %obj.setImageTrigger(0,false);
  249.    %obj.clearAim();
  250.   // echo( "onTargetExitLOS >>> %obj.clearAim (from:"@%obj@")");
  251.    %obj.currentTarget = 0;  // forget this target
  252.    %this.schedule($MIN_SCAN_GAP, "doScan", %obj);
  253. }
  254.  
  255. function AIBeast::setRandomDestination(%this,%obj)
  256. {
  257.    if(!isObject(%obj))
  258.       return;
  259.    %pos = %obj.getTransform();
  260.    %x = getWord(%pos, 0); %y = getWord(%pos, 1); %z = getWord(%pos, 2);
  261.    %rnd1 = getrandom(20); %rnd2 = getrandom(20); %rnd3 = getrandom(20);
  262.  
  263.    if( %rnd1 < 10 )
  264.       %rnd01 = %x + getrandom(30);
  265.    else
  266.       %rnd01 = %x - getrandom(30);
  267.  
  268.    if( %rnd2 < 10 )
  269.       %rnd02 = %y + getrandom(30);
  270.    else
  271.       %rnd02 = %y - getrandom(30);
  272.  
  273.    if( %rnd3 < 10 )
  274.       %rnd03 = %z + getrandom(30);
  275.    else
  276.       %rnd03 = %z - getrandom(30);
  277.  
  278.    %obj.setMoveDestination(%rnd01 SPC %rnd02 SPC %rnd03);
  279. }
  280.  
  281. //
  282. //-----------------------------------------------------------------------------
  283.  
  284. function AIPlayer::spawnBot(%index,%location)
  285. {
  286.    // An example function which creates a new AIPlayer object
  287.    // using the the example player datablock.
  288.    %me = new AIPlayer() {
  289.       dataBlock = BeastAvatar;
  290.       aiPlayer = true;
  291.    };
  292.    MissionCleanup.add(%me);
  293.    AIGroup.add(%me);
  294.    // Player setup
  295.    /// defaults
  296.  
  297.    $mebot = %me;
  298.    %me.look = 0;
  299.    %me.range = 100;
  300.    %spawn=%location;
  301.  
  302.     %me.alertness = 75;
  303.     %me.aggression = 75;
  304.     %me.attention = 75;
  305.     %me.range = 50;
  306.  
  307.    %me.index = %index;
  308.    %me.setTransform(%spawn);
  309.    %me.setEnergyLevel(60);
  310.    %me.role = %role;
  311.    %me.setShapeName("Beast");
  312.    %me.attentionLevel = 0;
  313.    %me.nextBlockCheck = 0;
  314.    %weapon = new Item() {
  315.       dataBlock = CrossBow;
  316.    };
  317.    %ammo = new Item() {
  318.       dataBlock = CrossBowAmmo;
  319.    };
  320.  
  321.    MissionCleanup.add(%weapon);
  322.    MissionCleanup.add(%ammo);
  323.    %me.pickup(%weapon, 1);
  324.    %me.pickup(%ammo, 2);
  325.    %me.look = 0;
  326.    %me.setMoveSpeed(0);
  327.  
  328.    echo("Added Beast [" SPC %me SPC "] :" SPC %me.task SPC ":" SPC %me.role SPC "#" SPC  %me.index );
  329.  
  330.   %me.setAimLocation( $cardinalDirection[%me.look]);
  331.   %me.getDataBlock().schedule(5000, "DoScan", %me);
  332.  
  333.    return %me;
  334. }
  335.  
  336. function AIPlayer::GetTargetRange(%this, %target)
  337. {
  338.    $tgt = %target;
  339.    %tgtPos = %target.getPosition();
  340.    %eyePoint = %this.getWorldBoxCenter();
  341.    %distance = VectorDist(%tgtPos, %eyePoint);
  342. ///   echo("Actual range to target: " @ %distance );
  343.    return %distance;
  344. }
  345.  
  346. function AIPlayer::getClosestHuman(%this) {
  347. ///      echo( "getClosestHuman...");
  348.  
  349.    %index = -1;
  350.    %botPos = %this.getPosition();
  351.    %count = ClientGroup.getCount();
  352.    for(%i = 0; %i < %count; %i++)
  353.    {
  354.       %client = ClientGroup.getObject(%i);
  355.       if (%client.player $= "" || %client.player == 0 )
  356.          return -1;
  357.       %playPos = %client.player.getPosition();
  358.  
  359.       %tempDist = VectorDist(%playPos, %botPos);
  360.       if(%i == 0) {
  361.          %dist = %tempDist;
  362.          %index = %i;
  363.       }
  364.       else {
  365.          if(%dist > %tempDist) {
  366.             %dist = %tempDist;
  367.             %index = %i;
  368.          }
  369.       }
  370.    }
  371.    return %index;
  372. }
  373.  
  374. function CreateBots()
  375. {
  376.   new SimSet(AIGroup);
  377.   AIPlayer::spawnBot(0,"382 -705 167 1 0 0 0");
  378.   AIPlayer::spawnBot(1,"282 -856 149 1 0 0 0");
  379.   AIPlayer::spawnBot(2,"351 -757 202 1 0 0 0");
  380.   AIPlayer::spawnBot(3,"46 -800 201 1 0 0 0");
  381.   AIPlayer::spawnBot(4,"728 -746 201 1 0 0 0");
  382.   AIPlayer::spawnBot(5,"579 -314 196 1 0 0 0");
  383.   AIPlayer::spawnBot(6,"207 -166 161 1 0 0 0");
  384.   AIPlayer::spawnBot(7,"697 -513 175 1 0 0 0");
  385.   AIPlayer::spawnBot(8,"844 -543 201 1 0 0 0");
  386.   AIPlayer::spawnBot(9,"65 -542 165 1 0 0 0");
  387.   AIPlayer::spawnBot(10,"-609 -238 146 1 0 0 0");
  388.   AIPlayer::spawnBot(11,"-345 101 173 1 0 0 0");
  389.   AIPlayer::spawnBot(12,"306 267 157 1 0 0 0");
  390.   AIPlayer::spawnBot(13,"643 -232 140 1 0 0 0");
  391.   AIPlayer::spawnBot(14,"760 -127 201 1 0 0 0");
  392. }
  393.